#[cfg(target_os = "macos")]
use objc::runtime::{Class, Object};
use objc::{msg_send, sel, sel_impl};
use tauri::WebviewWindow;

/// 设置窗口层级为高于菜单栏（NSMainMenuWindowLevel + 2）
/// 这样可以覆盖整个屏幕，包括状态栏
#[cfg(target_os = "macos")]
pub fn set_window_level_above_menu(window: &WebviewWindow) -> Result<(), String> {
    unsafe {
        // 获取窗口的 NSWindow 实例
        // Tauri 2.0 中 ns_window() 返回 *mut c_void，需要转换为 *mut Object
        let ns_window_ptr = match window.ns_window() {
            Ok(ptr) => ptr,
            Err(e) => {
                return Err(format!("无法获取 NSWindow: {}，窗口可能尚未完全初始化", e));
            }
        };
        
        // 检查指针是否有效
        if ns_window_ptr.is_null() {
            return Err("NSWindow 指针为空".to_string());
        }
        
        let ns_window: *mut Object = ns_window_ptr as *mut Object;
        
        // NSMainMenuWindowLevel 的值是 24，加 2 使其高于菜单栏
        // 这样可以覆盖整个屏幕，包括状态栏
        let level: i64 = 26; // NSMainMenuWindowLevel (24) + 2
        
        // 调用 setLevel: 方法
        let _: () = msg_send![ns_window, setLevel: level];
        
        // 设置窗口行为，使其可以覆盖全屏应用
        // NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8 = 256
        let behavior: u64 = 1 << 8; // NSWindowCollectionBehaviorFullScreenAuxiliary
        
        // 调用 setCollectionBehavior: 方法
        let _: () = msg_send![ns_window, setCollectionBehavior: behavior];
        
        Ok(())
    }
}

/// 设置窗口层级为 NSScreenSaverWindowLevel (值为 1000) - 保留用于向后兼容
#[cfg(target_os = "macos")]
pub fn set_window_level_to_screensaver(window: &WebviewWindow) -> Result<(), String> {
    unsafe {
        // 获取窗口的 NSWindow 实例
        // Tauri 2.0 中 ns_window() 返回 *mut c_void，需要转换为 *mut Object
        let ns_window_ptr = match window.ns_window() {
            Ok(ptr) => ptr,
            Err(e) => {
                return Err(format!("无法获取 NSWindow: {}，窗口可能尚未完全初始化", e));
            }
        };
        
        // 检查指针是否有效
        if ns_window_ptr.is_null() {
            return Err("NSWindow 指针为空".to_string());
        }
        
        let ns_window: *mut Object = ns_window_ptr as *mut Object;
        
        // NSScreenSaverWindowLevel 的值是 1000
        let level: i64 = 1000;
        
        // 调用 setLevel: 方法
        let _: () = msg_send![ns_window, setLevel: level];
        
        Ok(())
    }
}

#[cfg(not(target_os = "macos"))]
pub fn set_window_level_to_screensaver(_window: &WebviewWindow) -> Result<(), String> {
    Err("此功能仅在 macOS 上可用".to_string())
}

/// 设置窗口背景透明
#[cfg(target_os = "macos")]
pub fn set_window_transparent(window: &WebviewWindow) -> Result<(), String> {
    unsafe {
        // 获取窗口的 NSWindow 实例
        let ns_window_ptr = match window.ns_window() {
            Ok(ptr) => ptr,
            Err(e) => {
                return Err(format!("无法获取 NSWindow: {}，窗口可能尚未完全初始化", e));
            }
        };
        
        // 检查指针是否有效
        if ns_window_ptr.is_null() {
            return Err("NSWindow 指针为空".to_string());
        }
        
        let ns_window: *mut Object = ns_window_ptr as *mut Object;
        
        // 获取 NSColor 类
        let ns_color_class = match objc::runtime::Class::get("NSColor") {
            Some(cls) => cls,
            None => return Err("无法获取 NSColor 类".to_string()),
        };
        
        // 调用 NSColor 的 clearColor 类方法获取透明颜色
        // 注意：clearColor 返回的是 autoreleased 对象，在 ARC 环境下会自动管理
        let clear_color: *mut Object = msg_send![ns_color_class, clearColor];
        
        if clear_color.is_null() {
            return Err("无法获取透明颜色对象".to_string());
        }
        
        // 设置窗口背景颜色为透明
        let _: () = msg_send![ns_window, setBackgroundColor: clear_color];
        
        // 设置窗口不透明为 false
        let opaque: bool = false;
        let _: () = msg_send![ns_window, setOpaque: opaque];
        
        // 禁用窗口阴影以更好地显示透明效果
        let has_shadow: bool = false;
        let _: () = msg_send![ns_window, setHasShadow: has_shadow];
        
        Ok(())
    }
}

#[cfg(not(target_os = "macos"))]
pub fn set_window_transparent(_window: &WebviewWindow) -> Result<(), String> {
    Err("此功能仅在 macOS 上可用".to_string())
}

/// 设置应用为辅助应用（不显示在 Dock 和菜单栏）
#[cfg(target_os = "macos")]
pub fn set_activation_policy_accessory() -> Result<(), String> {
    unsafe {
        // 获取 NSApplication 共享实例
        let app_class = Class::get("NSApplication")
            .ok_or("无法获取 NSApplication 类")?;
        let app: *mut Object = msg_send![app_class, sharedApplication];
        
        if app.is_null() {
            return Err("无法获取 NSApplication 实例".to_string());
        }
        
        // NSApplicationActivationPolicyAccessory = 1
        // 这会让应用不显示在 Dock，也不会在菜单栏显示应用名称
        let policy: isize = 1;
        let _: () = msg_send![app, setActivationPolicy: policy];
        
        Ok(())
    }
}

/// 设置应用为普通应用（显示在 Dock 和菜单栏）
#[cfg(target_os = "macos")]
pub fn set_activation_policy_regular() -> Result<(), String> {
    unsafe {
        // 获取 NSApplication 共享实例
        let app_class = Class::get("NSApplication")
            .ok_or("无法获取 NSApplication 类")?;
        let app: *mut Object = msg_send![app_class, sharedApplication];
        
        if app.is_null() {
            return Err("无法获取 NSApplication 实例".to_string());
        }
        
        // NSApplicationActivationPolicyRegular = 0
        let policy: isize = 0;
        let _: () = msg_send![app, setActivationPolicy: policy];
        
        Ok(())
    }
}

#[cfg(not(target_os = "macos"))]
pub fn set_activation_policy_accessory() -> Result<(), String> {
    Ok(())
}

#[cfg(not(target_os = "macos"))]
pub fn set_activation_policy_regular() -> Result<(), String> {
    Ok(())
}

